#ifndef MUCMAS_USER_INC_WS2812_H
#define MUCMAS_USER_INC_WS2812_H

#include "flash.h"
#include "stm32f1xx_hal.h"

// 待发送数组中用来表示元数据中一个bit的8bit值
#define CODE_1 (0xFC)
#define CODE_0 (0x80)


// WS2812屏幕的宽度为32, 高度为8
// 因为有一些特征强依赖这一数据
// 比如可以用一个byte表示表示一列灯
// 所以不使用宏

// 缓存待发送数组之前和之后的数值为0的部分的长度(需乘以24, 单位为byte)
#define PRE_LENGTH 1
#define POST_LENGTH 1

// 元数据在flash中的地址
extern const uint32_t Ws_addrList[];

// 缓存元数据
typedef struct{
  uint8_t name[16]; // 16byte
  uint8_t color[32][8][3]; // 768byte
  struct{
    uint8_t g;
    uint8_t r;
    uint8_t b;
    uint8_t idx;
  } history[60]; // 240byte
  // 共1024byte, 恰好是一个flash页的大小
}Matrix;
typedef struct{
  Matrix matrix;
  // 待发送数组
  uint8_t buffer[PRE_LENGTH + 256 + POST_LENGTH][24];
  // 元数据和待发送数组之间的列偏移量
  struct{
    uint8_t offset : 6; // 灯的偏移量
    uint8_t reserve : 1; // 灯是否反向
    uint8_t  : 1;
  };
}Ws_HandleTypeDef;
extern Ws_HandleTypeDef hws;

void Ws_Init(void);
void Ws_Rename(const uint8_t *name);
void Ws_Clear(void);
void Ws_Load(uint8_t color[32][8][3]);
void Ws_Draw(void);
void Ws_Save(uint8_t idx);
void Ws_Read(uint8_t idx);

#endif
